home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-04
/
mawk10.zip
/
FIX_YTAB
< prev
next >
Wrap
Text File
|
1991-10-05
|
2KB
|
82 lines
#!/bin/sh
#
# This script removes bison's use of alloca()
#
# If the parser stack overflows, bison reallocates the stack using
# alloca(). The chance of parser overflow on an awk program is nil,
# and since mawk never uses alloca() and some systems don't have it
# the most portable solution is to #if 0 it out
#
# This script only works with bison 1.14
#
# If you use an earlier version of bison, look for the line
# tested for in state == 2 below. This is the push of a new
# state on the parser stack. You want to make overflow work
# like this:
# if ( parser stack overflow )
# { errmsg(0, "parser stack overflow") ; exit(1) ; }
# Alternatively, if you have alloca() don't do anything, you'll
# get a little dead code. Or upgrade your bison.
#
# Also with bison 1.14, two arrays yyphrs[] and yyrhs[] slip
# through that aren't needed if YYDEBUG == 0 so this script
# also puts #if YYDEBUG != 0 conditionals around them. This
# only matters to those with small (64K) or so memory.
# This script is useful for any bison output to be used for
# example under MsDOS with a small model program.
awk_program='
BEGIN { state = 0 }
NR==2 && !/Bison/ {
print "fix_ytab: y.tab.c is not Bison output" | "cat 1>&2"
exit 1
}
state == 0 && /^static const short yyprhs\[\] = {/ {
print "#if YYDEBUG != 0"
print
state = 1
next
}
state == 1 && /^#if YYDEBUG/ {
print "#endif"
print
state = 2
next
}
state == 2 && /^[ \t]*if \(yyssp >= yyss \+ yystacksize - 1\)/ {
print ; getline ; print
print "\t/* this can never happen */"
print "\terrmsg(0 , \"parser stack overflow\") ; exit(1) ;"
print "#if 0"
state = 3
next
}
state == 3 && /YYABORT/ {
print
print "#endif /* if 0 */"
state = 4
next
}
{ print }'
awk "$awk_program" $*